package com.companyname.domain;

public class SnakeMatrix {
    /*
     * 1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29
     * 28 27 10 16 15 14 13 12 11
     */

    public static void show(int size) {
        int[][] matric = new int[size][size];
        int row = 0;
        int column = 0;
        if (size == 0) {
            return;
        }
        int maxNum = size * size;
        matric[0][0] = 1;
        for (int count = 1; count < maxNum;) {
            // 是否为可向右的 条件：下一元素列数不超过最大值 并且 下一个元素值为0
            if (column + 1 < size && matric[row][column + 1] == 0) {
                // 向右增长
                for (;;) {
                    column++;
                    count++;
                    matric[row][column] = count;
                    // showMatric(matric);
                    // 退出条件： 下一个元素列值超出最大值 或者 下个元素值不为0
                    if (column + 1 >= size || matric[row][column + 1] != 0) {
                        break;
                    }
                }
            }

            // 是否为可向下的 条件：下一元素行数不超过最大值 并且 下一个元素值为0
            if (row + 1 < size && matric[row + 1][column] == 0) {
                // 向下增长
                for (;;) {
                    row++;
                    count++;
                    matric[row][column] = count;
                    // showMatric(matric);
                    // 退出条件： 下一个元素列值超出最大值 或者 下个元素值不为0
                    if (row + 1 >= size || matric[row + 1][column] != 0) {
                        break;
                    }
                }
            }

            // 是否为可向左的 条件：下一元素列数大于0 并且 下一个元素值为0
            if (column - 1 >= 0 && matric[row][column - 1] == 0) {
                // 向左增长
                for (;;) {
                    column--;
                    count++;
                    matric[row][column] = count;
                    // showMatric(matric);
                    // 退出条件： 下一个元素列值小于0 或者 下个元素值不为0
                    if (column - 1 < 0 || matric[row][column - 1] != 0) {
                        break;
                    }
                }
            }
            // 是否为可向上的 条件：下一元素行数大于0 并且 下一个元素值为0
            if (row - 1 > 0 && matric[row - 1][column] == 0) {
                // 向上增长
                for (;;) {
                    row--;
                    count++;
                    matric[row][column] = count;
                    // showMatric(matric);
                    // 退出条件： 下一个元素列值小于0 或者 下个元素值不为0
                    if (row - 1 < 0 || matric[row - 1][column] != 0) {
                        break;
                    }
                }
            }
        }
        showMatric(matric);
    }

    public static void showMatric(int[][] matric) {
        for (int i = 0; i < matric.length; i++) {
            for (int j = 0; j < matric[i].length; j++) {
                System.out.printf("%4d", matric[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }

}
